from .celery import celery


def init_celery(app):
    from celery import Task
    # 1) 定义带 Flask 上下文的 Task 基类
    class ContextTask(Task):
        abstract = True

        def __call__(self, *args, **kwargs):
            with app.app_context():
                # 注意：调用 run 而不是 __call__ 避免双重 __call__ 调用
                return self.run(*args, **kwargs)

    # 2) 在构造时传入 task_cls，让 Celery 内部直接使用它
    celery.conf.update(
        main=app.name,
        task_cls=ContextTask,
        task_serializer="json",
        result_serializer="json",
        accept_content=["json"],
        task_ignore_result=False,  # 确保不全局忽略结果
    )
    # 3) 更新配置并设为默认实例（可选）
    celery.config_from_object(app.config["CELERY"])
    celery.set_default()  # 根据文档，在有多个 Celery 实例时用得上

    # 4) 把它挂到 Flask extensions（可选），方便其它地方 `current_app.extensions['celery']` 调用
    app.extensions = getattr(app, 'extensions', {})
    app.extensions['celery'] = celery
    return celery
